package org.oak.interceptor;

import org.oak.annotation.RequiresToken;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * org.oak.interceptor.TokenInterceptor
 *
 * @author ZRS
 * @version V1.0
 * @since 2025/10/30 18:38
 */

@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断handler是否为HandlerMethod实例
        if (!(handler instanceof HandlerMethod)) {
            return true; // 非控制器方法，直接放行
        }

        HandlerMethod handlerMethod = (HandlerMethod) handler;

        Method method = handlerMethod.getMethod();
        Class<?> clazz = handlerMethod.getBeanType();

        // 检查类或方法上是否有@RequiresToken注解
        boolean requiresToken = false;
        if (clazz.isAnnotationPresent(RequiresToken.class) || method.isAnnotationPresent(RequiresToken.class)) {
            requiresToken = true;
        }

        // 如果不需要验证Token，直接放行
        if (!requiresToken) {
            return true;
        }

        // 从请求头或请求参数中获取Token
        String token = request.getHeader("Authorization");
        if (token == null || token.isEmpty()) {
            token = request.getParameter("token");
        }

        // 如果使用Bearer Token格式
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7); // 去掉"Bearer "前缀
        }

        // 验证Token
        if (token == null || !validateToken(token)) {
            // Token无效或不存在，返回401未授权
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write("{\"code\":401,\"message\":\"Token无效或已过期\"}");
            return false;
        }

        // Token验证通过，可以从Token中解析用户信息并设置到请求属性中
        String userId = parseUserIdFromToken(token);
        request.setAttribute("currentUserId", userId);

        return true; // 继续处理请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理后，视图渲染前的操作
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求完成后的清理工作
    }

    /**
     * 验证Token的有效性
     */
    private boolean validateToken(String token) {
        // 实际项目中，这里会调用Token服务进行验证
        // 可以使用JWT、Redis等方式实现Token存储和验证
        // 这里简单模拟验证逻辑
        return token != null && token.length() > 8; // 示例验证条件
    }

    /**
     * 从Token中解析用户ID
     */
    private String parseUserIdFromToken(String token) {
        // 实际项目中，这里会从Token中解析用户信息
        // 例如使用JWT解析payload
        return "user123"; // 示例返回
    }
}
